# -*- coding: utf-8 -*-
"""
金桔王意图识别节点
根据用户消息和历史记录，使用LLM进行意图识别
"""
import traceback
from common.log import logger
from common.enum_types import IntentionType, ActionType
from .workflow_utils import WorkflowState, extract_message_content
from .prompt import INTENTION_PROMPT
from agent.llm import llm, embeddings, cllm
from common.useful_func import parse_llm_json_response

# 集成LLM
try:
    logger.debug(f"[意图识别] 🤖 LLM集成成功")
except ImportError as e:
    logger.warning(f"[意图识别] ⚠️ LLM导入失败: {e}")
    llm, embeddings, cllm = None, None, None

def intention_recognition_node(state: WorkflowState) -> dict:
    """
    意图识别节点 - 使用LLM进行意图识别
    
    Args:
        state: 工作流状态
    
    Returns:
        更新后的状态字典
    """
    try:
        chat_handler = state.get("chat_handler")
        logger.debug(f"[意图识别] 🧠 开始分析用户意图")
        
        # 提取消息内容
        message_content = extract_message_content(state["wx_msg"])
        if not message_content.strip():
            logger.warning(f"[意图识别] ❓ 消息内容为空")
            if chat_handler:
                chat_handler.add_action("EMPTY_MESSAGE")
            return {"intention": IntentionType.EMPTY_INSTRUCTION.value}
        
        # 使用LLM进行意图识别
        intention = _llm_based_intention_recognition(state, message_content)
        
        # 记录意图识别完成
        if chat_handler:
            chat_handler.add_action(ActionType.with_context(ActionType.INTENTION_RECOGNIZED, intention))
        
        logger.info(f"[意图识别] ✅ 识别结果: {intention}")
        return {"intention": intention}
        
    except Exception as e:
        # 记录意图识别异常
        chat_handler = state.get("chat_handler")
        if chat_handler:
            chat_handler.add_action(ActionType.INTENTION_ERROR.value)
            chat_handler.set_note(f"意图识别异常: {str(e)}")
        
        logger.error(f"[意图识别] ❌ 处理异常: {e} - {traceback.format_exc()}")
        return {"intention": IntentionType.BAVARDER.value, "error_message": f"意图识别失败: {str(e)}"}


def _llm_based_intention_recognition(state: WorkflowState, message_content: str) -> str:
    """
    基于LLM的意图识别
    
    Args:
        state: 工作流状态
        message_content: 用户消息内容
        
    Returns:
        识别的意图类型
    """
    if not cllm:
        logger.warning(f"[意图识别] ⚠️ LLM不可用")
        return IntentionType.AI_UNAVAILABLE.value
    
    try:
        # 获取ChatHandler实例
        chat_handler = state.get("chat_handler")
        if not chat_handler:
            logger.error("[意图识别] ❌ ChatHandler不可用")
            return IntentionType.AI_UNAVAILABLE.value
        
        # 使用ChatHandler获取提示词上下文
        user = state.get("user")
        chat_history = state.get("chat_history", [])
        prompt_context = chat_handler.get_prompt_context(user, chat_history)
        
        # 构建完整的提示词
        formatted_prompt = INTENTION_PROMPT.format(**prompt_context)
        
        # 调用LLM
        response = cllm.invoke(formatted_prompt)
        response_content = response.content if hasattr(response, 'content') else str(response)
        
        logger.info(f"[意图识别] 🤖 LLM响应: {response_content}")
        
        # 解析JSON响应
        intention = _parse_llm_response(response_content)
        return intention
        
    except Exception as e:
        logger.error(f"[意图识别] ❌ LLM意图识别失败: {e} - {traceback.format_exc()}")
        return IntentionType.AI_UNAVAILABLE.value


def _parse_llm_response(response_content: str) -> str:
    """
    解析LLM的JSON响应
    
    Args:
        response_content: LLM响应内容
        
    Returns:
        解析出的意图类型
    """
    # 使用通用的JSON解析函数
    intention = parse_llm_json_response(
        response_content=response_content,
        target_key="intention",
        default_value=None  # 先设为None，以便区分是否解析成功
    )
    
    # 如果解析失败（返回None），则使用默认值并记录警告
    if intention is None:
        logger.warning(f"[意图识别] ⚠️ 无法解析LLM响应，使用默认意图: {response_content}")
        return IntentionType.BAVARDER.value
    
    # 解析成功，返回结果
    return intention